﻿namespace 工厂模式
{
    //简单工厂模式
    //我是调用者，我需要一个水果，而水果是一个泛指的概念，具体到水果的种类如苹果，梨子，香蕉
    //这时候有个水果工厂，我只需要和工厂讲我需要的水果的名字，他就返回对应的水果给我，我不知道水果是怎么创建的，工厂给我做

    /// <summary>
    /// 水果父类
    /// </summary>
    public class Fruit
    {
        public string Type
        { get { return "我是水果"; } set { } }
    }

    /// <summary>
    /// 苹果
    /// </summary>
    public class Apple : Fruit
    {
        public string Name
        { get { return "我是苹果"; } set { } }
    }

    /// <summary>
    /// 梨子
    /// </summary>
    public class Pear : Fruit
    {
        public string Name
        { get { return "我是梨子"; } set { } }
    }

    /// <summary>
    /// 香蕉
    /// </summary>
    public class Banana : Fruit
    {
        public string Name
        { get { return "我是香蕉"; } set { } }
    }

    /// <summary>
    /// 草莓
    /// </summary>
    public class Strawberry : Fruit
    {
        public string Name
        { get { return "我是草莓"; } set { } }
    }

    /// <summary>
    /// 水果工厂
    /// </summary>
    public class FruitsFactory
    {
        //将构建过程封装可以有效的降低代码耦合，减少代码重复
        //实际上，产品的构造往往是相当复杂的，例如构建苹果的过程应该需要种子，阳光，水分，养分，而且是经常变化的，例如科学家某天发明了让苹果更香甜的肥料，那么苹果的构造过程又有了不同
        //因此，将工厂的构造过程对调用者隐藏，那么产品的构成无论如何修改那也是工厂的事，调用者完全不用担心
        public Fruit Create(string FruitName)
        {
            switch (FruitName)
            {
                case "苹果":
                    //new 种子
                    //new 阳关
                    //new 水分
                    //new 养料
                    return new Apple();

                case "梨子": return new Pear();
                case "香蕉": return new Banana();
                case "草莓": return new Strawberry();
                default: return default;
            }
        }
    }
}